
#include "touch.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


#include <linux/input.h>


/*
	Get_Point: 获取触摸屏一个点的坐标值 
	返回值: 
		无
*/
void Get_Point(int *x, int *y) 
{
	*x = -1;
	*y = -1;

	//打开触摸屏文件
	int fd_ts = open("/dev/input/event0", O_RDWR);
	if(fd_ts == -1)
	{
		perror("open event0 error");
		return  ;
	}

	//定义一个结构体 变量 
	struct input_event ts;
	while(1)
	{
		int r = read(fd_ts, &ts, sizeof(ts));
		if(r != sizeof(ts))
		{
			continue;             //没读完返回
		}
		
		//解析结构体里面的成员信息
		switch(ts.type)
		{
			case EV_KEY: 
				break;
			case EV_REL:
				break;
			case EV_ABS: 
				switch(ts.code)
				{
					case ABS_X: 
						*x = ts.value * 800 / 1024;			
						break;
					case ABS_Y: 
						*y = ts.value * 480 / 600;
						break;
					case ABS_PRESSURE: 
						break;
				}
		}

		//当*x和*y均保存了所需值后，跳出while(1)
		if( *x >= 0 && *y >= 0 )
		{
			break;
		}
	}

	close(fd_ts);
}




/*
	Get_Move_Direction: 获取手指滑动方向 
	返回值: 
		返回手指滑动的方向
*/
enum Move Get_Move_Direction(void)
{
	int x1 = -1, y1 = -1;
	int x2, y2;
	
	//打开触摸屏文件
	int fd_ts = open("/dev/input/event0", O_RDWR);
	if(fd_ts == -1)
	{
		perror("open event0 error");
		return -1;
	}

	//定义一个结构体 变量 
	struct input_event ts;
	while(1)
	{
		int r = read(fd_ts, &ts, sizeof(ts));
		if(r != sizeof(ts))
		{
			continue;
		}
		if(ts.type == EV_ABS && ts.code == ABS_X)
		{
			if(x1 < 0)
			{
				x1 = ts.value;
			}
			x2 = ts.value;
		}

		if(ts.type == EV_ABS && ts.code == ABS_Y)
		{
			if(y1 < 0)
			{
				y1 = ts.value;
			}
			y2 = ts.value;
		}

		//GEC6818 || GEC210
		if( (EV_ABS==ts.type && ABS_PRESSURE == ts.code && ts.value == 0 ) || 
			(EV_KEY==ts.type && ts.code == BTN_TOUCH && ts.value == 0) )
		{
			close(fd_ts);
			
			//解析手指滑动的方向，并且返回方向即可
			int del_x = abs(x1 - x2);
			int del_y = abs(y1 - y2);
			if(del_x > del_y)
			{
				//左右滑动
				if(x1 < x2)
				{
					return MOVE_RIGHT;
				}
				else 
				{
					return MOVE_LEFT;
				}
			}
			else 
			{
				//上下滑动
				if(y1 < y2)
				{
					return MOVE_DOWN;
				}
				else 
				{
					return MOVE_UP;
				}
			}
		}
	}
}






